package util;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import java.util.Arrays;

/**
 * @Author: yuisama
 * @Date: 2022/6/10 12:13
 * @Description:根据文件名生成全小写拼音与首字母小写拼音工具类
 */
public class PinyinUtil {
    public static final HanyuPinyinOutputFormat FORMAT;

    /**
     * 中文字符格式
     */
    private static final String CHINESE_PATTERN = "[\\u4E00-\\u9FA5]";

    static {
        FORMAT = new HanyuPinyinOutputFormat();
        // 全小写转换
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        // 不添加音调
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        // 设置带V显示，比如绿为lv
        FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);
    }

    /**
     * 根据文件名返回文件小写全拼以及文件小写首字母结果
     * 这里不考虑多音字的情况，多音字我们选择多个结果的第一个值作为结果
     * eg : 和 -> he
     * @param fileName
     * @return
     */
    public static String[] getPinYinByFileName(String fileName) {
        // 此时返回值只有两个,第一个字符串表示全小写文件名全拼,第二个字符串为文件名小写首字母
        String[] ret = new String[2];
        StringBuilder allName = new StringBuilder();
        StringBuilder firstCase = new StringBuilder();
        for (char c : fileName.toCharArray()) {
            try {
                // 这里我们选择多音字的第一个结果作为全拼的返回值
                String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c,FORMAT);
                if (pinyins == null || pinyins.length == 0) {
                    // 出现非汉语的字符直接按照原字符保存
                    allName.append(c);
                    firstCase.append(c);
                }else {
                    allName.append(pinyins[0]);
                    firstCase.append(pinyins[0].charAt(0));
                }
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                // 出现非汉语的字符直接按照原字符保存
                allName.append(c);
                firstCase.append(c);
            }
        }
        ret[0] = allName.toString();
        ret[1] = firstCase.toString();
        return ret;
    }

    /**
     * 判断字符串str中是否包含中文
     * @param str
     * @return
     */
    public static boolean strContainsChinese(String str) {
        return str.matches(".*" + CHINESE_PATTERN + ".*");
    }

    public static void main(String[] args) throws Exception{
        String str1 = "中华人民共和国";
        String str2 = "中华1人民共b和国";
        System.out.println(Arrays.toString(getPinYinByFileName(str1)));
        System.out.println("----------------------------------------");
        System.out.println(Arrays.toString(getPinYinByFileName(str2)));
        String str3 = "abcd";
        String str4 = "ab中cd";
        System.out.println(strContainsChinese(str3));
        System.out.println(strContainsChinese(str4));

    }
}
